home *** CD-ROM | disk | FTP | other *** search
/ GFX Sensations 1 / Graphic Sensations - Volume 1.iso / tools / amiga / 3d_tools / t3dsrc.lha / t3dlib.h < prev    next >
C/C++ Source or Header  |  1994-01-20  |  10KB  |  336 lines

  1. /* t3dlib.h - definitions needed to interface to TTDDD library
  2.  *          - written by Glenn M. Lewis - 7/19/91
  3.  * $Id: t3dlib.h,v 1.26 1994/01/20 22:14:52 glewis Exp $
  4.  */
  5.  
  6. #ifdef AMIGA
  7.  
  8. #ifdef _M68881
  9. #include <m68881.h>
  10. #endif
  11.  
  12. /* The following has been tested using SAS/C on an Amiga by Helge Rasmussen */
  13. #ifdef __SASC
  14. #include <string.h>
  15. #include <stdlib.h>
  16. #include <exec/types.h>
  17. #else
  18. #define  bcopy(s,d,n)    (void)memcpy((d),(s),(n))
  19. #define  bzero(d,n)        (void)memset((d),0,(n))
  20. #define  bcmp(b1,b2,n)    memcmp((b1),(b2),(n))
  21. #define  index            strchr
  22. #define  rindex            strrchr
  23. #endif
  24.  
  25. #else
  26.  
  27. #include <strings.h>
  28. #include <malloc.h>
  29. char *calloc();
  30.  
  31. #endif
  32.  
  33. #ifdef SYSV
  34. extern char *memcpy(), *memset();
  35. #define bcopy(s,d,n)    (void)memcpy((d),(s),(n))
  36. #define bzero(d,n)        (void)memset((d),0,(n))
  37. #define bcmp(b1,b2,n)    memcmp((b1),(b2),(n))
  38. #define index            strchr
  39. #define rindex            strrchr
  40. #endif
  41.  
  42. #ifndef AMIGA
  43. #ifndef UBYTE
  44. #define UBYTE unsigned char
  45. #endif
  46. #ifndef BYTE
  47. #define BYTE char
  48. #endif
  49.  
  50. #ifndef UWORD
  51. #define UWORD unsigned short
  52. #endif
  53. #ifndef WORD
  54. #define WORD short
  55. #endif
  56.  
  57. #ifndef ULONG
  58. #define ULONG unsigned long
  59. #endif
  60. #ifndef LONG
  61. #define LONG long
  62. #endif
  63. #endif
  64.  
  65. #ifndef FRACT
  66. #define FRACT double
  67. #endif
  68.  
  69. typedef struct { double x,y,z; } XYZ_st;    /* Used to be val[3] */
  70. typedef struct { UBYTE r,g,b;  } RGB_st;    /* Used to be val[3] */
  71. typedef struct { XYZ_st came, rota; double foca; } OBSV;
  72. typedef struct { double at, by; RGB_st to; } FADE;
  73. typedef struct { RGB_st hori, zeni; } SKYC;
  74. typedef char BRSH[81];
  75. typedef struct { XYZ_st tran, scal, rota1, rota2, rota3; } MTRX;
  76. typedef struct { XYZ_st xaxi, yaxi, zaxi; } AXIS;
  77. typedef struct { char path[19]; XYZ_st tran, rota, scal; UWORD info; } STRY;
  78. typedef struct {
  79.     MTRX mtrx;
  80.     char filename[81];
  81. } EXTR;
  82. typedef struct {
  83.     UBYTE type;
  84.     float indx;
  85. } MTTR;
  86. struct OBJECT {
  87.     EXTR *extr;    /* Either EXTR or DESC */
  88.     struct DESC *desc;
  89.     struct OBJECT *parent;    /* whose child this OBJECT is */
  90.     struct OBJECT *child;    /* children of this OBJECT - not for EXTR */
  91.     struct OBJECT *next;    /* At this level in the hierarchy */
  92.     void *user;        /* User-defined data for any purpose */
  93. };
  94. typedef struct OBJECT OBJECT;
  95. typedef struct {
  96.     UWORD num;
  97.     UBYTE *eflg;
  98. } EFLG;
  99. struct FGRP {
  100.     struct FGRP *next;    /* Linked list */
  101.     UWORD num;
  102.     char name[19];    /* 18 allowed in file */
  103.     UWORD *face;
  104. };
  105. typedef struct FGRP FGRP;
  106. typedef struct {
  107.     UWORD  Flags;
  108.     MTRX   TAxis;
  109.     double Params[16];
  110.     UBYTE  PFlags[16];
  111.     UBYTE  SubName[81];
  112.     UBYTE  Length;
  113.     UBYTE  Name[81];
  114. } TXT2;
  115. typedef struct DESC {
  116.     char name[19];
  117.     WORD *shap;
  118.     XYZ_st *posi;
  119.     AXIS *axis;
  120.     XYZ_st *size;
  121.     XYZ_st *pnts;
  122.     RGB_st *colr, *refl, *tran, *spc1;
  123.     UWORD *edge, *face, pcount, ecount, fcount; 
  124.     UBYTE *clst, *rlst, *tlst;
  125.     double *tpar;
  126.     UBYTE *surf;
  127.     MTTR  *mttr;
  128.     UBYTE *spec;
  129.     UBYTE *prp0, *prp1;
  130.     double *ints;
  131.     XYZ_st *int1;
  132.     STRY *stry;
  133.     FGRP *fgrp;
  134.     EFLG *eflg;
  135.     TXT2 *txt2[4];
  136. } DESC;
  137.  
  138. /* extern UBYTE defclst[3], defrlst[3], deftlst[3], defspc1[3]; */
  139.  
  140. /* Add staging file information for Imagine support */
  141. /* It appears that the staging files use 3 FRACT's to represent colors
  142.  * instead of 3 UBYTEs...  Hmmm...
  143.  */
  144.  
  145. struct SAXIS { struct SAXIS *next, *prev; UWORD flags, start, stop; };
  146. typedef struct SAXIS SAXIS;
  147.  
  148. struct GLB2 {
  149.     struct GLB2 *next, *prev;
  150.     UWORD flags, start, stop;
  151.     ULONG sky_blending;
  152.     double starfield;
  153.     ULONG transition;
  154.     /* The following are really colors */
  155.     XYZ_st ambient, horizon, zenith1, zenith2, fog_color;
  156.     double fog_bottom, fog_top, fog_length;
  157.     ULONG brush_seq, backdrop_seq;
  158.     char backdrop[256];            /* Fixed length */
  159.     char globalbrush[256];        /* Variable length */
  160. };
  161. typedef struct GLB2 GLB2;
  162.  
  163. struct LITE {
  164.     struct LITE *next, *prev;
  165.     UWORD flags, start, stop;
  166.     /* The following are really colors */
  167.     XYZ_st color;
  168.     ULONG transition;
  169. };
  170. typedef struct LITE LITE;
  171.  
  172. struct SFILE {
  173.     struct SFILE *next, *prev;
  174.     UWORD flags, start, stop;
  175.     double cycles_to_perform;
  176.     double initial_cycle_phase;
  177.     ULONG transition;
  178.     char object_description[256];    /* Variable length */
  179. };
  180. typedef struct SFILE SFILE;
  181.  
  182. struct OSIZ { struct OSIZ *next,*prev; UWORD flags, start, stop; XYZ_st size; };
  183. typedef struct OSIZ OSIZ;    /* Size */
  184.  
  185. struct POSN { struct POSN *next,*prev; UWORD flags, start, stop; XYZ_st posn; };
  186. typedef struct POSN POSN;    /* Position */
  187.  
  188. struct ALGN { struct ALGN *next,*prev; UWORD flags, start, stop; XYZ_st algn; };
  189. typedef struct ALGN ALGN;    /* Alignment */
  190.  
  191. struct PALN { struct PALN *next,*prev; UWORD flags, start, stop; };
  192. typedef struct PALN PALN;        /* Path Alignment */
  193.  
  194. struct PTH2 {
  195.     struct PTH2 *next, *prev;
  196.     UWORD flags, start, stop;
  197.     ULONG acceleration_frames;
  198.     double start_speed;
  199.     ULONG deacceleration_frames;
  200.     double end_speed;
  201.     char path[256];                /* Variable length */
  202. };
  203. typedef struct PTH2 PTH2;        /* Follow Path */
  204.  
  205. struct TALN {
  206.     struct TALN *next, *prev;
  207.     UWORD flags, start, stop;
  208.     double initial_y, final_y;
  209.     char trackobj[256];            /* Variable length */
  210. };
  211. typedef struct TALN TALN;    /* Track alignment */
  212.  
  213. struct HING {
  214.     struct HING *next, *prev;
  215.     UWORD flags, start, stop;
  216.     char hingeobj[256];            /* Variable length */
  217. };
  218. typedef struct HING HING;    /* Hinge */
  219.  
  220. struct SOBJ {
  221.     struct SOBJ *next, *prev;
  222.     /* Required subchunks in the SOBJ chunk... */
  223.     char name[18];    /* CHUNK: Name, fixed=18 */
  224.     UWORD stgf;        /* CHUNK: always zero? */
  225.     /* Possible subchunks in the SOBJ chunk... */
  226.     OSIZ *osiz;        /* Size */
  227.     POSN *posn;        /* Position */
  228.     ALGN *algn;        /* Alignment */
  229.     PALN *paln;        /* Path Alignment */
  230.     TALN *taln;        /* Track Alignment */
  231.     PTH2 *pth2;        /* Follow Path */
  232.     GLB2 *glb2;        /* Globals */
  233.     SAXIS *axis;    /* Stagefile AXIS */
  234.     LITE *lite;        /* Light */
  235.     HING *hing;        /* Hinge */
  236.     SFILE *file;    /* Stage file */
  237. };
  238. typedef struct SOBJ SOBJ;
  239.  
  240. typedef struct {
  241.     UWORD maxf;
  242.     /* Just so we don't have to search through the doubly-linked list */
  243.     /* every time we wish to add to the tail, keep a pointer to head&tail */
  244.     SOBJ *head, *tail;
  245. } ISTG;
  246.  
  247. /* Back to old Turbo Silver stuff... */
  248.  
  249. #define STNC BRSH
  250. #define TXTR BRSH
  251. typedef struct {
  252.     BRSH brsh[8];
  253.     STNC stnc[8];
  254.     TXTR txtr[8];
  255.     OBSV *obsv;
  256.     BYTE otrk[19];
  257.     STRY *ostr;
  258.     FADE *fade;
  259.     SKYC *skyc;
  260.     RGB_st *ambi;
  261.     BYTE *glb0;
  262. } INFO;
  263.  
  264. typedef struct {
  265.     INFO *info;            /* The INFO description in the file */
  266.     ISTG *istg;            /* Imagine staging file */
  267.     OBJECT *object;        /* The first object in the world */
  268.     void *user;        /* User-defined data for any purpose */
  269.     /* Some private variables needed to parse input file - don't touch! */
  270.     int num_OBJ, num_DESC, num_TOBJ, cur_line;
  271.     FILE *inp;
  272.     OBJECT *curobj;
  273. } WORLD;
  274.  
  275. typedef struct {
  276.     double minx, maxx, miny, maxy, minz, maxz;
  277. } MBB;
  278.  
  279. #ifdef __STDC__
  280. #define P0()            void
  281. #define P1(a)            a
  282. #define P2(a,b)            a,b
  283. #define P3(a,b,c)        a,b,c
  284. #define P4(a,b,c,d)        a,b,c,d
  285. #define P5(a,b,c,d,e)    a,b,c,d,e
  286. #else
  287. #define P0()        
  288. #define P1(a)        
  289. #define P2(a,b)        
  290. #define P3(a,b,c)    
  291. #define P4(a,b,c,d)    
  292. #define P5(a,b,c,d,e)    
  293. #endif
  294.  
  295. WORLD *read_World(P1(FILE*));            /* world = read_World(FILE *); ..figures out format */
  296. WORLD *free_World(P1(WORLD*));            /* world = free_World(world *);   ...frees a WORLD* */
  297. void merge_World(P1(WORLD*));            /* merge_World(world *); ..optimizes points & edges */
  298. WORLD *read_TTDDD(P1(FILE*));            /* world = read_TTDDD(FILE *);      ...0 on failure */
  299. WORLD *read_TDDD(P1(FILE*));            /* world = read_TDDD(FILE *);       ...0 on failure */
  300. WORLD *read_LWOB(P1(FILE*));            /* world = read_LWOB(FILE *);       ...0 on failure */
  301. WORLD *read_ISTG(P1(FILE*));            /* world = read_ISTG(FILE *);       ...0 on failure */
  302. int write_TTDDD(P2(WORLD*,FILE*));        /* write_TTDDD(world *, FILE *);    ...0 on failure */
  303. int write_TDDD(P2(WORLD*,FILE*));        /* write_TDDD(world *, FILE *);     ...0 on failure */
  304. int write_Rayshade(P2(WORLD*,FILE*));    /* write_Rayshade(world *, FILE *); ...0 on failure */
  305. int write_PostScript(P3(WORLD*,FILE*,int));    /* write_PostScript(world *, FILE *, view); ..ditto */
  306. int write_MIF(P3(WORLD*,FILE*,int));    /* write_MIF(world *, FILE *, view); ..0 on failure */
  307. void calculate_MBB_world(P1(WORLD*));    /* calculate_MBB_world(WORLD *); */
  308. void calculate_MBB(P1(OBJECT*));        /* calculate_MBB(OBJECT *); */
  309. OBJECT *linear_morph(P3(OBJECT*,OBJECT*,double));    /* linear_morph(obj1, obj2, time); /* 0.0<=time<=1.0 */
  310. OBJECT *create_object(P0());            /* p = create_object(); */
  311. OBJECT *free_object(P1(OBJECT*));        /* from freeworld.c */
  312. int count_objects(P2(OBJECT*,OBJECT**));    /* Used by "morph()" */
  313. int morph(P5(WORLD*,WORLD*,int,char*,OBJECT*(*func)()));    /* morph(world1, world2, num, name, morph_function); */
  314. void free_desc(P1(DESC*));                /* free_desc(DESC *); */
  315. void match_points(P3(int,OBJECT*,OBJECT*));    /* match_points(numpoints, obj1, obj2); */
  316. void sort_points(P2(DESC*,int(*cmp)()));
  317. int cmpXYZ(P2(XYZ_st*,XYZ_st*));        /* comparison for sort_points */
  318. void move_extr(P2(OBJECT*,MTRX*));
  319. void OUT_MEM(P1(char*));
  320. void load_staging_frame_objects(P2(WORLD*,int));    /* (world, frame); load a frame's objects */
  321. int write_OFF(P4(WORLD*,char*,int,int));
  322. int write_NFF(P2(WORLD*,FILE*));
  323. int write_DXF(P2(WORLD*,FILE*));
  324. int write_POVRay(P2(WORLD*,FILE*));
  325. int write_Vort(P2(WORLD*,FILE*));
  326. int write_LWOB(P2(WORLD*,FILE*));
  327.  
  328. /* Some stuff for PostScript and MIF output */
  329. extern double XSIZE, YSIZE;    /* (in inches) Default: 8.5x11.0 */
  330.  
  331. #define VIEW_TOP    0    /* eye at (0,0,+inf) */
  332. #define VIEW_FRONT    1    /* eye at (0,-inf,0) */
  333. #define VIEW_ISO    2    /* eye at (+inf,-inf,+inf) */
  334. #define VIEW_RIGHT    3    /* eye at (+inf,0,0) */
  335. #define VIEW_ALL_FOUR 4    /* Place all on the same page */
  336.